#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>

//declaracao de escopos
int palindromo(char *palavra); // calcula se a palavra e um palindromo

//variaveis globais
int count=0,count2=0;

int main(){
   
   FILE *fp,*fp1;
   char c,cc[2],frase[10000],palavra[30];
   int flag,tam,i,aux;
   int aux_palin,aux_primo;
   int tamanho_arquivo;
   
   fp = fopen("shakespe.txt","r");
   
   //caso o arquivo nao exita
   if(fp == NULL)
       perror("Erro ao abrir o arquivo...\n");
   
   //pegando o tamanho do arquivo  
   fseek(fp,0,SEEK_END);
   tamanho_arquivo = ftell(fp);     
   rewind(fp);    
   
   //inicializando variaveis
   strcpy(frase,"");
   strcpy(palavra,"");
   strcpy(cc,"");
   flag = 0;
   
   // esse for busca por palavras palindromos
   for(i=0;i<tamanho_arquivo;i++){           
             
       c = fgetc(fp);
       
       //apenas reconhecem palavras que possuem caracteres de 'a' a 'z' tanto maiusculo quanto minusculos          
       if(c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z'){
            cc[0] = c;
            cc[1] = '\0';
            strcat(palavra,cc);
            flag = 1;  
       }
       
       
       else {
            if(flag == 1){
   
                 //verifica se a palavra e um palindromo                 
                 aux_palin = palindromo(palavra);	
                
                 //se for palindromo
                 if(aux_palin == 1){
                          count2++;
                      
                 }
                 
                 //inicializa variaveis para proxima palavra a ser lida do arquivo
                 strcpy(palavra,"");
                 flag = 0;       
            }
            else
                /*caso contraio inicializamos a variavel palavra pra garantir concistencia
                no codigo */
                strcpy(palavra,"");
      
       }
   }

   rewind(fp);   //voltando para o inicio do arquivo

   // ja esse busca por frase palindromos
   for(i=0;i<tamanho_arquivo;i++){ 
                                             
       c = fgetc(fp); // lendo o caracter do arquivo
        
       // identificando a frase          
       if( (c != '.') && (c != '?') && (c != '!') && (!feof(fp)) ){
             
            if(aux == 1 && c == ' ' && c == '\n')
                   aux = 0;
                   
            else {
                 aux = 0;    
                 cc[0] = toupper(c); // case sensitive
                 cc[1] = '\0';
                 
                 if(isalpha(c))
                      strcat(frase,cc);
                 flag = 1; 
            } 
       }
   
       
       else {
            // para frases
            if(flag == 1){ 
                 
                 //verifica se a frase e um palindromo                 
                 aux_palin = palindromo(frase);
                 
                  if(aux_palin == 1){
                      count++;        
                      
                 }
                 aux = 1; 
                 flag = 0;    
                 strcpy(frase,"");    
            }
            
            else
                strcpy(frase,"");     
       }
   }
   
   //fecha arquivos
   fclose(fp);
   
   //imprime a quantida de palavra palindromos primos
   printf("\nPossui %d palavra palindromos\n",count2);
   printf("\ne tambem %d frases palindromos\n",count);   
   
}


// calcula se a palavra e um palindromo
int palindromo(char *palavra){

    int i,tam;
    
    tam = strlen(palavra);
    
    //reconhecemos apenas palavras que seja maior que dois de numeros de caracteres
    if(tam <= 2)   return 0;
    
    for(i=0;i<tam;i++){
                   
         if(palavra[i] != palavra[tam-i-1])
              return 0;                       
    }
    
    return 1;
}




